package com.taichuan.selfcheck.ui.fragment;

import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.Target;
import com.taichuan.keysupport.Key;
import com.taichuan.selfcheck.R;
import com.taichuan.selfcheck.config.PropertyDefaultValue;
import com.taichuan.selfcheck.mvp.presenter.EmptyPresenter;
import com.taichuan.selfcheck.mvp.viewinterface.EmptyInterface;
import com.taichuan.selfcheck.ui.dialog.ResultDialog;
import com.taichuan.selfcheck.ui.fragment.base.AppBaseFragment;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.OnClick;

/**
 * 该类主要用于 实现 屏幕素质测试 - 灰阶测试
 *
 * @author CamelLuo
 * @version 2021/7/1
 */
public class ScreenGrayScaleTestFragment extends AppBaseFragment<EmptyInterface, EmptyPresenter> implements EmptyInterface {
    private static final String TAG = ScreenGrayScaleTestFragment.class.getSimpleName();

    /**
     * 定义一个Handler事件用于 进入下一项测试项
     */
    private static final int MSG_STEP_NEXT = 1;

    @BindView(R.id.screen_gray_scale_test_content_layout)
    LinearLayout screenGrayScaleContentLayout;
    @BindView(R.id.screen_gray_scale_test_name_textView)
    TextView testNameTv;

    /**
     * 灰阶测试中每一项测试的布局控件View 的集合
     */
    private List<LinearLayout> grayScaleTestViewsList = new ArrayList<>();
    /**
     * 灰阶测试中每一项测试的名称
     */
    private String[] grayScaleTestNameArray;

    /**
     * 定义一个变量用于记录当前显示的测试项
     */
    private int stepCount = 0;

    ResultDialog resultDialog;


    @Override
    protected int setContentViewId() {
        return R.layout.fragment_screen_gray_scale_test;
    }

    @Override
    protected void initView(View view, Bundle bundle) {
        //设置弹窗发送的事件——屏幕颜色
        resultDialog = new ResultDialog(PropertyDefaultValue.FUNCTION_TEST_1,
                getResources().getString(R.string.btn_settings_screen_gray_scale_test), getActivity());

        //初始化 灰阶测试所需的资源图片
        initGrayScaleTestResources();
        //展示第一个测试项
        nextStepGrayScaleTest(false,0);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        //移除所有消息事件
        stepHandler.removeCallbacksAndMessages(null);
    }

    /**
     * 定义一个方法用于将彩条测试的各项测试图片 按照一定的显示比例 加载到布局文件中，并添加到List中
     * 以下为各测试项的名称，以及其对应的图片资源文件，及摆放位置和显示比例
     *                           下(50%)      上(50%)
     * 灰阶测试：8级（垂直）1     step_left1  step_right1
     * 灰阶测试：8级（垂直）2     step02
     * 灰阶测试：8级（水平）      step03
     * 灰阶测试：16级（垂直）     step04
     * 灰阶测试：16级（水平）     step05
     * 灰阶测试：32级（垂直）     step06
     * 灰阶测试：32级（水平）     step07
     * 灰阶测试：64级（垂直）     step08
     * 灰阶测试：64级（水平）     step09
     * 灰阶测试：256级（垂直）    step10
     * 灰阶测试：256级（水平）    step11
     * 暗阶测试图1               pic_anjie1
     * 暗阶测试图2               pic_anjie2
     * 亮阶测试图                pic_liangjie
     *                            上(50%)          下(50%)
     * 彩色梯度：红              step15_left     step15_right
     * 彩色梯度：绿              step16_left     step16_right
     * 彩色梯度：蓝              step17_left     step17_right
     * 彩色梯度：16级垂直（红）    step18
     * 彩色梯度：32级垂直（红）    step19
     * 彩色梯度：256级垂直（红）   red_gradient
     * 彩色梯度：16级垂直（绿）    step21
     * 彩色梯度：32级垂直（绿）    step22
     * 彩色梯度：256级垂直（绿）   green_gradient
     * 彩色梯度：16级垂直（蓝）    step24
     * 彩色梯度：32级垂直（蓝）    step25
     * 彩色梯度：256级垂直（蓝）   blue_gradient
     */
    private void initGrayScaleTestResources() {
        //将灰阶测试中的每一页测试的布局文件都添加到List中


        //灰阶测试：8级（垂直）1
        grayScaleTestViewsList.add(add2GrayScaleView(R.mipmap.step_left1,R.mipmap.step_right1));
        //灰阶测试：8级（垂直）2
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step02));
        //灰阶测试：8级（水平）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step03));
        //灰阶测试：16级（垂直）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step04));
        //灰阶测试：16级（水平）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step05));
        //灰阶测试：32级（垂直）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step06));
        //灰阶测试：32级（水平）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step07));
        //灰阶测试：64级（垂直）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step08));
        //灰阶测试：64级（水平）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step09));
        //灰阶测试：256级（垂直）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step10));
        //灰阶测试：256级（水平）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step11));
        //暗阶测试图1
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.pic_anjie1));
        //暗阶测试图2
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.pic_anjie2));
        //亮阶测试图
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.pic_liangjie));
        //彩色梯度：红
        grayScaleTestViewsList.add(add2GrayScaleView(R.mipmap.step15_left,R.mipmap.step15_right));
        //彩色梯度：绿
        grayScaleTestViewsList.add(add2GrayScaleView(R.mipmap.step16_left,R.mipmap.step16_right));
        //彩色梯度：蓝
        grayScaleTestViewsList.add(add2GrayScaleView(R.mipmap.step17_left,R.mipmap.step17_right));
        //彩色梯度：16级垂直（红）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step18));
        //彩色梯度：32级垂直（红）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step19));
        //彩色梯度：256级垂直（红）
        grayScaleTestViewsList.add(add1GrayScaleView(R.drawable.red_gradient));
        //彩色梯度：16级垂直（绿）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step21));
        //彩色梯度：32级垂直（绿）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step22));
        //彩色梯度：256级垂直（绿）
        grayScaleTestViewsList.add(add1GrayScaleView(R.drawable.green_gradient));
        //彩色梯度：16级垂直（蓝）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step24));
        //彩色梯度：32级垂直（蓝）
        grayScaleTestViewsList.add(add1GrayScaleView(R.mipmap.step25));
        //彩色梯度：256级垂直（蓝）
        grayScaleTestViewsList.add(add1GrayScaleView(R.drawable.blue_gradient));

        //加载灰阶测试的每一项测试的测试名称
        grayScaleTestNameArray = getResources().getStringArray(R.array.screen_gray_scale_test_item_value);
    }

    /**
     * 定义一个方法用于 添加 一个灰度图片资源到 布局控件中
     *
     * @param grayScaleViewResId 灰度图片资源id
     * @return
     */
    private LinearLayout add1GrayScaleView(int grayScaleViewResId) {
        LinearLayout localLinearLayout = new LinearLayout(getActivity());
        localLinearLayout.setOrientation(LinearLayout.VERTICAL);
        localLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT));
        localLinearLayout.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

        ImageView imageView = new ImageView(getActivity());
        imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT));
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);

        localLinearLayout.addView(imageView);

        Glide.with(getActivity()).load(grayScaleViewResId).override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).into(imageView);
        return localLinearLayout;
    }

    /**
     * 定义一个方法用于 添加 两个灰度图片资源到 布局控件中
     * @param grayScaleView1ResId 下方 灰度图片资源id
     * @param grayScaleView2ResId 上方 灰度图片资源id
     * @return
     */
    private LinearLayout add2GrayScaleView(int grayScaleView1ResId, int grayScaleView2ResId) {
        LinearLayout localLinearLayout = new LinearLayout(getActivity());
        localLinearLayout.setOrientation(LinearLayout.VERTICAL);
        localLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT));
        localLinearLayout.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

        ImageView localImageView1 = new ImageView(getActivity());
        localImageView1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT, 1.0F));
        localImageView1.setScaleType(ImageView.ScaleType.FIT_XY);

        ImageView localImageView2 = new ImageView(getActivity());
        localImageView2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT, 1.0F));
        localImageView2.setScaleType(ImageView.ScaleType.FIT_XY);

        localLinearLayout.addView(localImageView2);
        localLinearLayout.addView(localImageView1);

        Glide.with(getActivity()).load(grayScaleView1ResId).override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).into(localImageView1);
        Glide.with(getActivity()).load(grayScaleView2ResId).override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).into(localImageView2);
        return localLinearLayout;
    }

    private final Handler stepHandler = new Handler(msg -> {
        switch (msg.what) {
            case MSG_STEP_NEXT: {
                boolean isStartByUser = (boolean) msg.obj;
                if (stepCount < grayScaleTestViewsList.size()) {
                    //替换添加
                    screenGrayScaleContentLayout.removeAllViews();
                    screenGrayScaleContentLayout.addView(grayScaleTestViewsList.get(stepCount));
                    //更新测试项名称
                    testNameTv.setText(grayScaleTestNameArray[stepCount]);
                    //计数+1
                    stepCount++;
                    //发布定时任务，每5秒切换一个测试项
                    nextStepGrayScaleTest(false,5 * 1000);
                } else {
                    //计数重置
                    stepCount = 0;
                    nextStepGrayScaleTest(false,0);
                }
                break;
            }
        }
        return false;
    });

    @OnClick(R.id.screen_gray_scale_test_content_layout)
    @Override
    protected void onXmlClick(View v) {
        super.onXmlClick(v);
        switch (v.getId()) {
            case R.id.screen_gray_scale_test_content_layout: {
                nextStepGrayScaleTest(true,0);
                break;
            }
        }
    }

    private void nextStepGrayScaleTest(boolean isStartByUser, int delayTime) {
        if (delayTime > 0){
            stepHandler.sendMessageDelayed(stepHandler.obtainMessage(MSG_STEP_NEXT,isStartByUser),delayTime);
        }else {
            //移除延时任务
            stepHandler.removeMessages(MSG_STEP_NEXT);
            stepHandler.sendMessage(stepHandler.obtainMessage(MSG_STEP_NEXT,isStartByUser));
        }

    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (resultDialog.isShowing()) {
            resultDialog.dispatchKeyEvent(event);
        }else {
            if (event.getKeyCode() == Key.Convert.KEYCODE_JING) {
                screenGrayScaleContentLayout.performClick();
            }
        }
        return super.dispatchKeyEvent(event);
    }

    @Override
    protected void getBundleValues(Bundle bundle) {

    }

    @Override
    protected boolean isAllowAutoFinishFragment() {
        return false;
    }

    @Override
    public void doOnAutoFinishFragment() {
        resultDialog.show();
    }

    @Override
    protected EmptyPresenter createPresenter() {
        return new EmptyPresenter();
    }
}
